// 
// Copyright(c) 2009 Syntext, Inc. All Rights Reserved.
// Contact: info@syntext.com, http://www.syntext.com
// 
// This file is part of Syntext Serna XML Editor.
// 
// COMMERCIAL USAGE
// Licensees holding valid Syntext Serna commercial licenses may use this file
// in accordance with the Syntext Serna Commercial License Agreement provided
// with the software, or, alternatively, in accorance with the terms contained
// in a written agreement between you and Syntext, Inc.
// 
// GNU GENERAL PUBLIC LICENSE USAGE
// Alternatively, this file may be used under the terms of the GNU General 
// Public License versions 2.0 or 3.0 as published by the Free Software 
// Foundation and appearing in the file LICENSE.GPL included in the packaging 
// of this file. In addition, as a special exception, Syntext, Inc. gives you
// certain additional rights, which are described in the Syntext, Inc. GPL 
// Exception for Syntext Serna Free Edition, included in the file 
// GPL_EXCEPTION.txt in this package.
// 
// You should have received a copy of appropriate licenses along with this 
// package. If not, see <http://www.syntext.com/legal/>. If you are unsure
// which license is appropriate for your use, please contact the sales 
// department at sales@syntext.com.
// 
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
// WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
// 
#ifndef FO_PROPERTY_PARSER_CONTEXT_H_
#define FO_PROPERTY_PARSER_CONTEXT_H_

#include "formatter/formatter_defs.h"
#include "common/String.h"
#include "common/Vector.h"

namespace Formatter
{

class ParserContext;
class PropertyContext;

union Value {
    enum ValueType {
        V_NONE, V_NUMERIC, V_NCNAME, V_COLOR, V_LAST
    };
    double      nval_;
    uint        ival_;
    class StringSect {
    public:
        const COMMON_NS::Char* sstart_;
        const COMMON_NS::Char* ssend_;
    } sval_;
    COMMON_NS::String asString() const
    {
        return COMMON_NS::String(sval_.sstart_, sval_.ssend_ - sval_.sstart_);
    }
};

class ValueTypePair {
public:
    char    type_;
    Value   value_;
};

typedef COMMON_NS::Vector<ValueTypePair> FunctionArgList;

class Allocation;
class PropertyContext;

class FORMATTER_EXPIMP ParserContext {
public:
    typedef COMMON_NS::String   CString;

    virtual double  dpi() const = 0;
    virtual double  fontSize(const CString& propertyName) const = 0;

    // To add a function, you must add it's declaration here and
    // implement it. Common functions are implemented in ParserContext.cxx.
    // Don't forget to add REGISTER_FUNCTION in PropertyParser.cxx.

    //! Min/Max functions both use the same argtypes
    bool            minValue(const FunctionArgList&, ValueTypePair&,
                             const PropertyContext*, const Allocation&) const;
    bool            maxValue(const FunctionArgList&, ValueTypePair&,
                             const PropertyContext*, const Allocation&) const;
    static const Value::ValueType minMaxArgTypes[];

    //! Returns inherited property
    virtual bool    inheritedPropertyValue(const FunctionArgList&,
                                           ValueTypePair&,
                                           const PropertyContext*,
                                           const Allocation&) const;
    static const Value::ValueType inheritedPropertyArgTypes[];

    //! Returns inherited property
    virtual bool    proportionalColumnWidth(const FunctionArgList&,
                                            ValueTypePair&,
                                            const PropertyContext*,
                                            const Allocation&) const;
    static const Value::ValueType proportionalArgTypes[];

    //! Returns inherited property
    virtual bool    bodyStart(const FunctionArgList&, ValueTypePair&,
                              const PropertyContext*, const Allocation&) const;
    static const Value::ValueType bodyStartArgTypes[];

    //! Returns inherited property
    virtual bool    labelEnd(const FunctionArgList&, ValueTypePair&,
                             const PropertyContext*, const Allocation&) const;
    static const Value::ValueType labelEndArgTypes[];

    virtual ~ParserContext() {}
};

class FORMATTER_EXPIMP PropertyContext {
public:
    typedef COMMON_NS::String   CString;

    virtual const CString&  propertyName() const = 0;
    virtual bool            resolveEnumToken(const CString& token,
                                             ValueTypePair& rv,
                                             const ParserContext& pc,
                                             const Allocation& alloc) const;
    virtual ~PropertyContext() {}
};

}

#endif // FO_PROPERTY_PARSER_CONTEXT_H_

